package QQCilent.Service;

import com.wyedu.qqcommon.Message;
import com.wyedu.qqcommon.MessageType;
import com.wyedu.qqcommon.User;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.Scanner;

/**
 *
 * 该类完成用户验证登录和用户注册
 */
public class UserClientService extends MessageClientServer {
    //设置为成员属性,这样别的方法也可以访问
    Scanner scanner = new Scanner(System.in);
    //作为成员属性可以直接调用


    private Socket socket = null;
    private User u = new User();



    //因为可能在其他地方使用user信息,因此设置为成员属性
    //根据userID和密码严重该用户是否合法
    public  boolean checkUser(String userId , String password) throws IOException {
        boolean b= false;
        //构造user对象
        u.setUserId(userId);
        u.setPasswd(password);
        //连接到服务器
        //发送user对象
        //创建socket对象
        //与客户的建立连接
        socket = new Socket(InetAddress.getByName("127.0.0.1"),9999);
        //获取对象的输入输出流
        ObjectOutputStream oos = null;
        ObjectInputStream ois = null;
        try {
             oos = new ObjectOutputStream(socket.getOutputStream());
             ois = new ObjectInputStream(socket.getInputStream());
            //1.此时把创建好的user对象传入到服务器
            oos.writeObject(u);
            //2.接受服务器返回的对象
            Message message = (Message) ois.readObject();

            //3.读取返回的对象.进行向下强转
            //4.判断是否登陆成功
            if(MessageType.MESSAGE_LOGIN_SUCCEED.equals(message.getMesType())){
                //此时是登录成功
                //由于需要一个线程一直和服务器保持联系,用于通讯,所以此时创建一个通信的线程类
                ClientConnectServerThread ccst = new ClientConnectServerThread(socket);

                ccst.start();//该线程一直在运行
                //创建一个管理客户端连接服务端的线程类
                //由于是static修饰的,所以可以通过类名调用
                //此时将该线程类添加到集合中
                ManageClientConnectServiceThread.addManageClientConnectServiceThread(userId,ccst);
                b = true;
                //在账号登录成功后给消息类也初始化
                super.setScanner(scanner);
                super.setSocket(socket);
                super.setU(u);
            }else {
                //登录失败,我们就不能启动和服务器通信的线程,此时的socket就需要关闭.
                //
                System.out.println("连接关闭"+socket.getPort()+" "+socket.getInetAddress().getHostAddress());
                socket.close();
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return b;
    }

    public void onLineFriendList(){

        //创建一个message对象
        Message message = new Message();
        //指定消息类型
        message.setMesType(MessageType.MESSAGE_GET_ONLINE_FRIEND);
        //指定发送id
        message.setSender(u.getUserId());
        message.setGetter(u.getUserId());

        try {
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            //将对象发送过去
            oos.writeObject(message);

            //
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
    public  void CloseConnection(){
        System.out.println("准备关闭程序...");
        Message message = new Message();
        message.setMesType(MessageType.MESSAGE_CLIENT_EXIT);//用户的请求信息
        message.setSender(u.getUserId());//把用户的名字发过去
        message.setGetter(u.getUserId());
        try {
            ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
            oos.writeObject(message);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println("成功关闭程序....");

    }

}
